package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.controller.vo.user.TicketSubscribeWxVO;
import com.bestcem.xm.user.grpc.client.dto.WxCodeSessionIdDTO;
import com.bestcem.xm.user.service.dto.user.*;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * 微信相关服务
 *
 * @author qiongyu.cui <qiongyu.cui@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/30 18:33
 */
public interface UserWxService {

    /**
     * 微信小程序 login 后获取并存储用户凭证
     *
     * @param code code信息
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.grpc.client.dto.WxCodeSessionIdDTO>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/7/24 18:31
     */
    ServiceResult<WxCodeSessionIdDTO> getAndSaveWxSessionInfoByCode(String code);

    /**
     * 小程序内切换账号接口
     *
     * @param userId 用户Id
     * @return List<OrgDisplayVO> 公司列表
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/02 16:30
     */
    ServiceResult<List<WxSwitchDTO>> wxAccountSwitch(String userId);

    /**
     * 微信小程序注册
     *
     * @param wxRegisterDTO 注册数据
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.WxLoginDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/30 15:46
     */
    ServiceResult<WxLoginDTO> wxMiniRegister(WxRegisterDTO wxRegisterDTO);

    /**
     * 微信公众号注册
     *
     * @param wxOffiRegisterDTO
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.WxOffiResultDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/30 16:45
     */
    ServiceResult<Object> wxOffiRegister(WxOffiRegisterDTO wxOffiRegisterDTO);

    /**
     * 微信登陆
     *
     * @param sessionId 微信用户的unionid
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.WxLoginDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/29 14:37
     */
    ServiceResult<WxLoginDTO> wxLogin(String sessionId);


    /**
     * 微信小程序用户登录查询
     *
     * @param requestDTO
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.WxAuthViewDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/31 13:35
     */
    ServiceResult<WxAuthViewDTO> wxAuthView(WxAuthViewRequestDTO requestDTO);


    /**
     * 微信用户关联User,签发token
     *
     * @param requestDTO
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.WxTokenViewDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/01 00:03
     */
    ServiceResult<WxTokenViewDTO> wxTokenView(WxTokenViewRequestDTO requestDTO);


    /**
     * 微信小程序 通过unionID无感登陆
     *
     * @param
     * @return UserLoginVO
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/30 13:53
     */
    ServiceResult<WxLoginDTO> loginBySessionId(String sessionId);

    /**
     * 个人中心绑定微信公众号
     *
     * @param userId 用户Id
     * @return openid 和 session_key
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/03/02 16:30
     */
    ServiceResult<String> wxOffiBind(String userId, String sessionId);


    /**
     * 微信小程序用户登录V2
     *
     * @param requestDTO
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/06/02 16:55
     */
    ServiceResult<Object> wxAuthViewV2(WxAuthViewV2RequestDTO requestDTO);

    /**
     * 企业微信中打开微信小程序 login 后获取并存储用户凭证 ok
     *
     * @param code
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/06/02 16:54
     */
    ServiceResult<String> wxWorkCode(String code);

    /**
     * 发送免费公司创建邮件/短信给用户
     *
     * @param orgCode  公司编码
     * @param userName 用户名
     * @param orgName  公司名称
     * @param email    用户邮箱
     * @param expire   到期时间
     * @param phone    用户手机号
     * @param orgId    公司id
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/6/6 10:34
     */
    void notifyFreeOrgCreated(String orgCode, String userName, String orgName, String email, Date expire, String phone, String orgId);

    /**
     * 微信绑定手机时，对应多个企业
     *
     * @param loginDTO
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.WxLoginDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/06/06 17:41
     */
    ServiceResult<WxLoginDTO> wxFastOrgLogin(WxFastOrgLoginDTO loginDTO);


    /**
     * 公众号订阅工单页面用户绑定微信
     *
     * @param openId 微信openId
     * @param userId 用户id
     * @param orgId  租户id
     * @return 绑定结果
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/7/13 17:29
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    ServiceResult<TicketSubscribeWxVO> ticketSubscribeWx(String openId, String userId, String orgId);
}
